package com.day3;

import java.security.PrivateKey;

/**
 * @program: java_base
 * @className: com.day3.PersonCircle
 * @description: 编写属性,并且生成get和set方法 2、提供构造函数创建圈子，传递圈子大小
 * 3、提供加入到圈子中的方法
 * @author: 513 王老师(qq:292817678,tel&微信:18688753763)
 * @create: 2020-09-16 14:59
 **/
public class PersonCircle {
    private int count = 0;//圈子的大小
    private Person first;//第一个人
    private Person last;//最后一个人


    // 创建一个圈子的构造函数

    /**
     *
     * @param count 圈子的大小
     */
    public PersonCircle(int count){
        // 循环创建person对象 加入圈子中
        for (int i = 0; i < count; i ++){
            Person p = new Person(i);
            //加入到圈子中
            add(p);
        }
    }

    /**
     * 将人添加到圈子中
     * @param p
     */
    public void add(Person p) {
        // 圈子中如果没有一个人 圈子的第一个和最后一个人都是新添加的人，新添加的人的左边和右边都是自己本身
        if(this.count == 0){
            this.first = p;
            this.last = p;
            p.setLeft(p);
            p.setRight(p);
        } else {

            /**
             * 最后一个人的右边 》 p
             * p的左边 》 原来的最后一个
             * p的右边 》 原来的第一个对象
             * 原来的第一个对象的左边 》 p
             * 圈子中的最后 变成了 p
             */
            this.last.setRight(p);
            p.setLeft(this.last);
            p.setRight(this.first);
            this.first.setLeft(p);
            this.last = p;
        }
        // 圈子中已经有人
        this.count ++;
    }


    /**
     * 从圈子中删除对象
     * @param p
     */
    public void delete(Person p){

        if(p.equals(this.first)){
            // 删除的是第一个对象
            /**
             * 最后一个元素的右边 》 删除元素右边的元素
             * 删除元素右边的元素的左边 》最后一个
             * 删除元素右边的元素作为圈子的第一个元素
             */
            this.last.setRight(p.getRight());
            p.getRight().setLeft(this.last);
            this.first  = p.getRight();
        } else if(p.equals(this.last)){
           // 删除的是最后一个
            /*
            删除元素的左边元素的右边 》 第一个元素
            第一个元素的左边 》 删除元素的左边元素
            将删除元素左边的元素设置成最后一个元素
             */
            p.getLeft().setRight(this.first);
            this.first.setLeft(p.getLeft());
            this.last = p.getLeft();

        } else {
            // 删除的是中间元素
            /*
            删除元素左边的元素的右边 》 删除元素右边的元素

            删除元素右边的元素的左边 》 删除元素左边的元素
             */
            p.getLeft().setRight(p.getRight());
            p.getRight().setLeft(p.getLeft());

        }

        // 圈子中的人数需要减1
        this.count --;
    }


    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public Person getFirst() {
        return first;
    }

    public void setFirst(Person first) {
        this.first = first;
    }

    public Person getLast() {
        return last;
    }

    public void setLast(Person last) {
        this.last = last;
    }
}
